<?php

class Admin_ExchangeCentersController extends Model3_Controller
{

    public function init()
    {
        if (!Model3_Auth::isAuth())
        {
            $this->redirect('Index/index');
        }
    }

    public function indexAction()
    {
        /**
         * Si trae paramnetros significa que viene de una actualización del centro
         * de intercambio, checamos que cumpla con campos obligatorios y mas restricciones.
         */
        if ($this->getRequest()->isPost() === true)
        {
            $success = $this->updateExchange();
            /*
             * Ocurrio un error
             */
            if ($success === false)
            {
                return;
            }
        }
        $em = $this->getEntityManager('DefaultDb');
        $pointsRepository = $em->getRepository('DefaultDb_Entities_Point');
        $statesRepository = $em->getRepository('DefaultDb_Entities_State');
        $exchangeCenters = $pointsRepository->getExchangesCenters();
        $exchangeCenterSession = new Model3_Session_Namespace('ExchangeCenter');
        /**
         * $exchangeCenterSession->successInsert la primera vez tiene el valor de
         * null ya que no ha sido definida (se define en la accion add de este
         * controlador).
         * Puede tener tres posibles valores:
         * null => indica que NO viene de una inserción (acción add).
         * true => indica que viene de una inserción (acción add) y que se realizó
         * correctamente.
         * false => indica que viene de una inserción (acción add) y que NO se 
         * realizó correctamente.
         */
        $urlChangeStatus = $this->view->url(array('controller' => 'ExchangeCenters',
            'action' => 'changeStatus'));
        $states = $statesRepository->findAll();
        $this->view->getJsManager()->addJs('application/Admin/ExchangeCenters/index.js');
        $this->view->getJsManager()->addJsVarEncode('urlChangeStatus', $urlChangeStatus);
        $this->view->successInsert = $exchangeCenterSession->successInsert;
        $this->view->msgError = $exchangeCenterSession->msgError;
        $this->view->states = $states;
        $this->view->title = 'Centros de intercambio';
        $this->view->description = 'Administración de centros de intercambio';
        $this->view->exchangeCenters = $exchangeCenters;
        $this->view->whereAmI = array();
        $this->view->setTemplate('Responsive-3.0');
        /**
         * Limpiamos la información temporal de la sesión.
         */
        $exchangeCenterSession->clear();
    }

    /**
     * Accion que inserta un centro de intercambio.
     */
    public function addAction()
    {
        $em = $this->getEntityManager('DefaultDb');
        $params = $this->getRequest()->getPost();
        $exchangeCenterSession = new Model3_Session_Namespace('ExchangeCenter');
        $exchangeCenterSession->successInsert = false; // voy de la inserción y hubo un error.
        $exchangeCenterSession->point = null;
        $exchangeCenterSession->msgError = null;
        try
        {
            $code = trim(strtoupper($params['code']));
            $name = trim(strtoupper($params['name']));
            $address = trim(strtoupper($params['address']));
            $ci = new DefaultDb_Entities_Point; // Punto que es un centro de intercambio
            $ci->setCode($code);
            $ci->setName($name);
            $ci->setAddress($address);
            $ci->setType(DefaultDb_Entities_Point::TYPE_EXCHANGE_CENTER);
            $ci->setStatus(DefaultDb_Entities_Point::STATUS_NORMAL);
            $state = $em->getRepository('DefaultDb_Entities_State')->find($params['state']);
            $ci->setState($state);
            $exchangeCenterSession->point = $ci;
            $pointsRepository = $em->getRepository('DefaultDb_Entities_Point');
            if ($pointsRepository->existByCode($params['code']) === true)
            {
                $exchangeCenterSession->msgError = 'Ya existe un centro de intercambio o punto de venta con esta clave.';
            }
            else
            {
                if (($ci->getCode() === null || $ci->getCode() == '') || ($ci->getName() === null || $ci->getName() == '') || (empty($params['pointType'])) || ($ci->getAddress() === null || $ci->getAddress() == ''))
                {
                    $em->persist($ci);
                    $em->flush();
                    $exchangeCenterSession->successInsert = true; // voy de la inserción y todo salió bien. 
                }
                else
                {
                    $exchangeCenterSession->msgError = 'Por favor verifica la información.';
                }
            }
        }
        catch (Exception $exc)
        {
            
        }
        $this->redirect('Admin/ExchangeCenters/Index');
    }

    /**
     * Accion invocada por ajax y que se encarga de cambiar el estatus de un 
     * centro de intercambio, si esta activo lo pone inactivo y viceversa.
     * @author Nylaye
     */
    public function changeStatusAction()
    {
        $em = $this->getEntityManager('DefaultDb');
        $params = $this->getRequest()->getPost();
        $id = isset($params['id']) === true ? $params['id'] : null;
        $success = false;
        if ($id !== null)
        {
            $pointsRepository = $em->getRepository('DefaultDb_Entities_Point');
            $point = $pointsRepository->find($id);
            if ($point instanceof DefaultDb_Entities_Point)
            {
                $point->toggleStatus();
                $em->persist($point);
                $em->flush();
                $success = true;
            }
        }
        $this->view->success = $success;
        $this->view->setUseTemplate(false);
    }

    /**
     * Accion que crea el formulario que permite editar un centro de intercambio.
     */
    public function editAction()
    {
        $id = $this->getRequest()->getParam('id');
        if ($id !== null)
        {
            $codeError = $this->getRequest()->getParam('error');
            if ($codeError !== null)
            {
                $msgError = $this->strCodeErrorEdit($codeError);
                $this->view->msgError = $msgError;
            }
            $em = $this->getEntityManager('DefaultDb');
            $statesRepository = $em->getRepository('DefaultDb_Entities_State');
            $pointsRepository = $em->getRepository('DefaultDb_Entities_Point');
            $ci = $pointsRepository->find($id);
            $states = $statesRepository->findAll();
            $this->view->whereAmI = array('Centros de intercambio' => $this->view->url(array(
                    'controller' => 'ExchangeCenters', 'action' => 'index', 'Editar' => null)));
            $this->view->ci = $ci;
            $this->view->states = $states;
            $this->view->title = 'Editar centro de intercambio';
            $this->view->description = 'Modifica los datos de un centro de intercambio';
            $this->view->setTemplate('Responsive-3.0');
        }
        else
        {
            $this->redirect('Admin/ExchangeCenters/Index');
        }
    }

    /**
     * Convierte el código de error a una cadena con una descripción del error.
     * @param int $codeError Código del error
     * @return string Descripción del error
     */
    private function strCodeErrorEdit($codeError)
    {
        $strError = '';
        switch ($codeError)
        {
            case 1:
                $strError = 'Todos los campos son obligatorios.';
                break;
            case 2:
                $strError = 'Ya existe un centro de intercambio o punto de venta con esta clave.';
                break;
        }
        return $strError;
    }

    /**
     * Actualizamos un centro de intercambio.
     * Si se encuentra algun error se redirige a la accion de edit con un código
     * de error que describe el problema encontrado.
     * @return boolean true si el centro de intercambio se actualizo correctaente,
     * false en cualquier otro caso
     */
    private function updateExchange()
    {
        $params = $this->getRequest()->getPost();
        $id = $params['id'];
        if ((empty($params['code']) === true) || (empty($params['name']) === true) || (empty($params['address']) === true) || (empty($params['state']) === true))
        {
            $this->redirect('Admin/ExchangeCenters/edit/id/' . $id . '/error/1');
            return false;
        }
        $em = $this->getEntityManager('DefaultDb');
        $pointsRepository = $em->getRepository('DefaultDb_Entities_Point');
        $code = trim(strtoupper($params['code']));
        $name = trim(strtoupper($params['name']));
        $address = trim(strtoupper($params['address']));
        $state = $params['state'];
        if ($pointsRepository->existByCode($code) === true)
        {
            $this->redirect('Admin/ExchangeCenters/edit/id/' . $id . '/error/2');
            return false;
        }
        $ci = $pointsRepository->find($id);
        $ci->setCode($code);
        $ci->setName($name);
        $ci->setAddress($address);
        $state = $em->getRepository('DefaultDb_Entities_State')->find($state);
        $ci->setState($state);
        $em->persist($ci);
        $em->flush();
        return true;
    }

}